﻿using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using System.Collections.Generic;
using System.ServiceModel;
using Sinacor.Infra.Service.Security.Services;

namespace Sinacor.Servico.Bovespa.Contabil.Service.ServiceContract
{
    /// <summary>
    /// ServiceContract Interface - IEventoContabil
    /// </summary>
    [ExceptionShielding]
    [ServiceContract(Namespace = "http://www.bovespa.com.br/Sinacor.Servico.Bovespa.Contabil.Service.ServiceContract", SessionMode = SessionMode.Allowed)]
    public interface IEventoContabil
    {
        #region Membros

        /// <summary>
        /// Serviço irá alterar o EventoContabil informado como parâmetro.
        /// </summary>
        /// <param name="request">DataContract.Request.EventoContabilRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "AlterarEventoContabil")]
        void AlterarEventoContabil(DataContract.Request.EventoContabilRequest request);

        /// <summary>
        /// Serviço irá alterar uma coleção de EventosContabeis informados como parâmetro.
        /// </summary>
        /// <param name="requestList">Lista de objetos DataContract.Request.EventoContabilRequest</param>
        [TransactionRequired]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "AlterarEventosContabeis")]
        void AlterarEventosContabeis(List<DataContract.Request.EventoContabilRequest> requestList);

        /// <summary>
        /// Serviço irá Consultar uma lista de EventosContabeis, utilizando o parâmetro informado.
        /// </summary>
        /// <param name="request">DataContract.Request.FiltroEventoContabilRequest</param>
        /// <returns>Lista de objetos DataContract.Response.EventoContabilResponse</returns>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ConsultarEventosContabeis")]
        List<DataContract.Response.EventoContabilResponse> ConsultarEventosContabeis(DataContract.Request.FiltroEventoContabilRequest request);

        /// <summary>
        /// Serviço irá excluir o EventoContabil informado como parâmetro.
        /// </summary>
        /// <param name="request">DataContract.Request.FiltroEventoContabilChave</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ExcluirEventoContabil")]
        void ExcluirEventoContabil(DataContract.Request.FiltroEventoContabilChave request);

        /// <summary>
        /// Serviço irá excluir uma coleção de EventosContabeis informados como parâmetro.
        /// </summary>
        /// <param name="requestList">Lista de objetos DataContract.Request.FiltroEventoContabilChave</param>
        [TransactionRequired]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ExcluirEventosContabeis")]
        void ExcluirEventosContabeis(List<DataContract.Request.FiltroEventoContabilChave> requestList);

        /// <summary>
        /// Serviço irá excluir/incluir/alterar os objetos EventoContabil informados como parâmetro.
        /// </summary>
        /// <param name="exclusaoList">Lista de objetos DataContract.Request.FiltroEventoContabilChave</param>
        /// <param name="inclusaoList">Lista de objetos DataContract.Request.EventoContabilRequest</param>
        /// <param name="alteracaoList">Lista de objetos DataContract.Request.EventoContabilRequest</param>
        [TransactionRequired]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ExecutarTransacoesEventoContabil")]
        void ExecutarTransacoesEventoContabil(  List<DataContract.Request.FiltroEventoContabilChave> exclusaoList,
                                                List<DataContract.Request.EventoContabilRequest> inclusaoList,
                                                List<DataContract.Request.EventoContabilRequest> alteracaoList);

        /// <summary>
        /// Serviço irá incluir o EventoContabil informado como parâmetro.
        /// </summary>
        /// <param name="request">DataContract.Request.EventoContabilRequest</param>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "IncluirEventoContabil")]
        void IncluirEventoContabil(DataContract.Request.EventoContabilRequest request);

        /// <summary>
        /// Serviço irá incluir uma coleção de EventosContabeis informados como parâmetro.
        /// </summary>
        /// <param name="requestList">Lista de objetos DataContract.Request.EventoContabilRequest</param>
        [TransactionRequired]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "IncluirEventosContabeis")]
        void IncluirEventosContabeis(List<DataContract.Request.EventoContabilRequest> requestList);

        /// <summary>
        /// Serviço irá Obter o EventoContabil informado como parâmetro.
        /// </summary>
        /// <param name="request">DataContract.Request.FiltroEventoContabilChave</param>
        /// <returns>DataContract.Response.EventoContabilResponse</returns>
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.BusinessFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.ValidationFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.GeneralFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.InvalidSessionFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.LicensingFault))]
        [FaultContract(typeof(Sinacor.Infra.Common.Exceptions.FaultContracts.AccessIsDeniedFault))]
        [OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, Action = "ObterEventoContabil")]
        DataContract.Response.EventoContabilResponse ObterEventoContabil(DataContract.Request.FiltroEventoContabilChave request);

        #endregion
    }
}
